﻿#ifndef ANIMATIONMANAGER_H
#define ANIMATIONMANAGER_H

#include <QObject>

#include "animationState.h"
#include "animationController.h"
#include "animationParseExeConfig.h"
#include "animationParseHEX.h"

#include <QThread>


#include "CommonHelper.h"

// 动画管理 提供QML接口、下位机交互接口
class AnimationManager : public QObject
{
    Q_OBJECT

private:
    AnimationManager();
    ~AnimationManager();

public:

    static AnimationManager& I();


    Q_INVOKABLE QVariantMap requestInfo(int idx);       // idx=0 设备页面的试验状态 idx=1 实验模拟的状态
    Q_INVOKABLE QVariantMap requestInfo_frame(int frame, int idx);
    Q_INVOKABLE int getFrameNum();

    Q_INVOKABLE void execConfig(int idx = 0);

    // 暂时留出来的QML接口，后续会改成和设备控制交互
    Q_INVOKABLE void reset();
    Q_INVOKABLE void turnWheel(int num, double speed = 1);
    Q_INVOKABLE void turnWheel_posi(int posi, int direct, double speed = 1);
    Q_INVOKABLE void turnWheel_posi(int posi, double speed = 1);        // 自己判断转动方向
    Q_INVOKABLE void addHat();
    Q_INVOKABLE void changeValve(int idx, bool state);
    Q_INVOKABLE void changeSyringe(int idx, double percentage, double speed = 1);       // 这里的速度给的是百分比
    Q_INVOKABLE void resetSyringe(int idx);



    Q_INVOKABLE void changeColumn(bool state);
    Q_INVOKABLE void changeDetector(bool state);

    Q_INVOKABLE void changeSpeedUnit(int type);
    Q_INVOKABLE int getSpeedUnit();

    // 管道接口
    Q_INVOKABLE void resetPipe();
    Q_INVOKABLE void changePipeDiameter(double diam);
    Q_INVOKABLE void setPipeSyringeSpeed(int idx, double speed);     // 这里的速度是 ml/s

    Q_INVOKABLE void crashStop();       // 急停(貌似已弃用)

    // 转盘复位
    Q_INVOKABLE void resetWheel(QString consumable);

    // 状态获取函数 (临时)
    Q_INVOKABLE bool            isVertexConnect(int v1, int v2);
    Q_INVOKABLE void            printCurrentPath();

    Q_INVOKABLE void updateColor(QString expName, int idx = 0);

    // 下位机接收指令，更新设备动画
    void handleHEXInstrunction(QStringList list);

    // 更新颜色


private:

    bool checkNullptr();        // 检测空指针的缩写

    QMap<int, QColor> getSyringeColorFromDatabase(QString expname);
    QMap<int, QColor> getSyringeColorFromDatabase(int id = 1);      // 和数据库中execConfig的内容对接



    AnimationParseHEX*      _parserHEX;
    AnimationParseExeConfig* _parserExe;

    // 一共两个动画状态
    AnimationState*         _state_equ;         // 设备状态  idx = 0
    AnimationState*         _state_simu;        // 模拟实验  idx = 1
    AnimationController*    _ctrl_equ;
    AnimationController*    _ctrl_simu;


};

#endif // ANIMATIONMANAGER_H
